# encoding: UTF-8
'''
预估保证金明细
last update: 2023年5月17日 11:05:57
'''
import easyquotation
import pandas as pd 
from datetime import date
from datetime import timedelta
import os,sys,codecs
today_date= date.today()
yesterday_date = today_date - timedelta(days = 1)
yesterday_date=yesterday_date.strftime('%Y%m%d')
today_date=today_date.strftime('%Y%m%d')


#获取本地路径下的基础数据
def joinPath(fileName):
    filePath=os.path.join(sys.path[0],fileName)
    return filePath

def ReadFile(filePath):
    with codecs.open(filePath, "r") as f:
        return f.read()
def WriteFile(filePath, u, encoding="utf-8"):
    # with codecs.open(filePath,"w",encoding) as f:
    with codecs.open(filePath, "wb") as f:
        f.write(u.encode(encoding, errors="ignore"))
def CSV_2_UTF8(src, dst):
    content = ReadFile(src)
    WriteFile(dst, content, encoding="utf-8")



def getLastQuote(codeList):
    # 查询行情快照
    quotation = easyquotation.use('sina') # 新浪 ['sina'] 腾讯 ['tencent', 'qq'] 
    quote=quotation.market_snapshot(prefix=True) # 获取全量行情快照
    # print(quote)
    quoteDataNew=pd.DataFrame(columns=['securityID', 'lastPrice'])


    # codeList=["000001.SZ","600000.SH"]
    for 代码 in codeList:
        if 代码[7:9]=="SZ":
            quoteList=[代码]
            代码="sz"+代码[0:6]
            try :
                最新价=quote[代码]["now"]
            except :
                最新价=quotation.get_stock_data([代码])[代码[2:8]]["now"]
            quoteList.append(最新价)
            quoteData=pd.DataFrame(quoteList).T
            quoteData.columns=['securityID', 'lastPrice']
            quoteDataNew=pd.concat([quoteDataNew,quoteData])
        elif 代码[7:9]=="SH":
            quoteList=[代码]
            代码="sh"+代码[0:6]
            try :
                最新价=quote[代码]["now"]
            except :
                最新价=quotation.get_stock_data([代码])[代码[2:8]]["now"]
            quoteList.append(最新价)
            quoteData=pd.DataFrame(quoteList).T
            quoteData.columns=['securityID', 'lastPrice']
            quoteDataNew=pd.concat([quoteDataNew,quoteData])

    return quoteDataNew




#合并信用资产列表
def 合并信用资产():
    信用资产合并=pd.DataFrame()
    image_dir_list = os.listdir(sys.path[0])  # source ：文件夹路径
    for image_dir in image_dir_list:
        if  os.path.splitext(image_dir)[1] == ".xls" and os.path.basename(image_dir)[0:4] == '信用资产':  # 后缀是tif, 前4个字符是abcc 的文件
            side = os.path.join(sys.path[0], image_dir)
            # print(side)
            信用资产=pd.read_excel(side)
            信用资产合并=pd.concat([信用资产合并,信用资产])
    return 信用资产合并

    
# 加载初始数据,转为utf-8格式

CSV_2_UTF8(joinPath("compactInfo"+"_"+today_date+".csv"),joinPath("compactInfo"+"_"+today_date+"_utf.csv"))
CSV_2_UTF8(joinPath("positionInfo"+"_"+today_date+".csv"),joinPath("positionInfo"+"_"+today_date+"_utf.csv"))
# CSV_2_UTF8(joinPath("担保品信息"+".csv"),joinPath("担保品信息"+"_utf.csv"))


融券合约路径=joinPath("compactInfo"+"_"+today_date+"_utf.csv")
持仓路径=joinPath("positionInfo"+"_"+today_date+"_utf.csv")
担保品信息路径=joinPath("担保品信息"+".xls")

融资融券合约=pd.read_csv(融券合约路径)
持仓=pd.read_csv(持仓路径)
担保品信息=pd.read_excel(担保品信息路径)


# print(type(融资融券合约["合约类型"].iloc[0]))
未还融券代码列表=set(融资融券合约[(融资融券合约["未还合约数量"]>0) & (融资融券合约["合约类型"]==1)]["securityID"].tolist())
# print(未还融券代码列表)
# 拼接行情
df=getLastQuote(未还融券代码列表)
# print(df)

含行情融资融券合约=pd.merge(融资融券合约, df, on=['securityID'], how='left')
含行情融资融券合约["融券市值"]=含行情融资融券合约["未还合约数量"]*含行情融资融券合约["lastPrice"]
含行情融资融券合约["融券占用保证金"]=含行情融资融券合约["融券市值"]*含行情融资融券合约["保证金比例"]
含行情融资融券合约["融券卖出金额"]=含行情融资融券合约["合约开仓金额"]*含行情融资融券合约["未还合约数量"]/含行情融资融券合约["合约开仓数量"]
含行情融资融券合约["融券浮盈"]=含行情融资融券合约["融券卖出金额"]-含行情融资融券合约["融券市值"]
担保品信息.rename(columns={'strSecurityID': 'securityID'}, inplace=True)
含折算率持仓信息=pd.merge(持仓, 担保品信息, on=['securityID'], how='left')
# 含行情融资融券合约.to_csv(joinPath("含行情融资融券合约"+".csv"),index=False)

含折算率持仓信息["折算后担保市值"]=含折算率持仓信息["当前市值"]*含折算率持仓信息["担保品折算率"]
# 含折算率持仓信息.to_csv(joinPath("含折算率持仓信息"+".csv"),index=False)
全部信用资产=合并信用资产()

全部信用资产["加现金(买担保品可用资金）"]=全部信用资产["买担保品可用资金"]
全部信用资产["加折算后证券市值"]=0
全部信用资产["加折算后融券浮盈"]=0
全部信用资产["减融券卖出金额"]=0
全部信用资产["减融券占用保证金"]=0
全部信用资产["减融券息费"]=全部信用资产["融券未还息费"]
全部信用资产.index=range(1,全部信用资产.shape[0]+1)   #将行索引置为连续唯一


            
# 遍历每个账号增加可用保证金明细字段
for index, row in 全部信用资产.iterrows():
    资金账号=row["账号"]
    全部信用资产.loc[index,"加折算后证券市值"]=含折算率持仓信息[含折算率持仓信息["账号"]==资金账号]["折算后担保市值"].sum()
    # print(row)
    # print(全部信用资产.loc[index,"加折算后证券市值"])
    全部信用资产.loc[index,"加折算后融券浮盈"]=含行情融资融券合约[(含行情融资融券合约["账号"]==资金账号) & (融资融券合约["合约类型"]==1) ]["融券浮盈"].sum()
    全部信用资产.loc[index,"减融券卖出金额"]=含行情融资融券合约[(含行情融资融券合约["账号"]==资金账号) & (融资融券合约["合约类型"]==1)]["融券卖出金额"].sum() 
    全部信用资产.loc[index,"减融券占用保证金"]=含行情融资融券合约[(含行情融资融券合约["账号"]==资金账号) & (融资融券合约["合约类型"]==1)]["融券占用保证金"].sum() 
    # print(全部信用资产.loc[index,"加折算后融券浮盈"])    
全部信用资产["预估可用保证金"]=全部信用资产["加现金(买担保品可用资金）"]+全部信用资产["加折算后证券市值"]+全部信用资产["加折算后融券浮盈"]-全部信用资产["减融券卖出金额"]-全部信用资产["减融券占用保证金"]-全部信用资产["减融券息费"]
# for index, row in 全部信用资产.iterrows():
#     资金账号=row["账号"]
#     print(row)


全部信用资产.to_csv(joinPath("含预估保证金明细-信用资产"+".csv"),index=False)

